home *** CD-ROM | disk | FTP | other *** search
- .8086
-
- ASSUME CS:CODE,DS:CODE
- CODE SEGMENT
-
- ORG 0100H
-
- START: JMP SHORT ENTRY
- DB 'COMPACK' ; ID-NAME
- DW HEADER ; ヘッダー位置
-
- INCLUDE SUB.ASM ; サブルーチン取り込み
-
- ;
- ; MAIN PROGRAM
- ;
- ENTRY PROC
- MOV BX,OFFSET FCB1+1 ; BX:005DH(FCB1)
- MOV DL,[BX] ; DL:文字数
- CMP DL,020H ; パラメータがない??
- JZ LIST ; 動作モード分岐(JNZ:RUN / JZ:LIST)
- ;
- ; 内部プログラム実行
- ;
- CALL SEARCH ; ヘッダ・サーチ( JNC:NOT FOUND )
- ; DI:SIZE / BP:ADRS / AL:COMPRESS
- JNC ERROR
- OR AL,AL ; 格納形式を調べる
- JNZ ERROR2 ; ( 圧縮は未対応 )
-
- CALL PSP ; PSP(DTA & FCB)作成
- CALL TRANS ; 転送プログラムを$F000~に配置
- MOV AX,0F000H ; プログラム転送 & 実行
- JMP AX
- ;
- ; エラー表示
- ;
- ERROR: CALL ZPR
- DB BELL,'そのコマンドは登録されていません.'
- DB CR,LF,LF,NULL
- MOV AX,4C01H ; 異常終了
- INT 21H ; DOSに戻る
-
- ERROR2: CALL ZPR
- DB BELL,'未サポートの格納形式です.'
- DB CR,LF,LF,NULL
- MOV AX,4C01H ; 異常終了
- INT 21H ; DOSに戻る
-
- ;
- ; コマンド一覧表示
- ;
- LIST: CALL ZPR
- DB '--------- Listing of basefile ---------'
- DB CR,LF,NULL
- MOV BX,OFFSET HEADER ; BX:ポインタ
- MOV DL,[BX] ; DL:プログラム連結数
- INC BX
- LIST1: XOR AL,AL
- MOV [BX+8],AL ; 文字終了マーク書き込み
- CALL ZPR2 ; コマンド名表示
- CALL ZPR
- DB TAB,NULL
- ADD BX,010H ; 次のヘッダにスキップ
- DEC DL
- JNZ SHORT LIST1
- CALL ZPR
- DB CR,LF,LF,NULL
- MOV AX,4C00H ; 正常終了
- INT 21H ; DOSに戻る
- ENTRY ENDP
-
-
- SEARCH PROC
- MOV SI,OFFSET HEADER ; SI:ポインタ
- MOV DL,[SI] ; DL:プログラム連結数
- INC SI
- #LOOP1: CALL COMPARE ; コマンド名を比較(CY=1..○/CY=0..×)
- JC SHORT #QUIT ; ○だったら脱出
- ADD SI,010H ; ×だったらヘッダーを一つスキップ
- DEC DL
- JNZ SHORT #LOOP1 ; まだコマンドが残ってる??
- CLC ; 見つからなかったねぇ...
- RET
- #QUIT: ADD SI,8
- MOV DI,[SI] ; DI:プログラムサイズ
- ADD SI,2
- MOV BP,[SI] ; BP:プログラム開始アドレス
- ADD SI,2
- MOV AL,[SI] ; AL:圧縮フラグ
- STC
- RET
- SEARCH ENDP
-
-
- COMPARE PROC
- PUSH SI
- PUSH DX
- MOV AH,8
- MOV BX,OFFSET FCB1+1 ; BX:005D (第一パラメータ)
- #LOOP1: MOV DL,[BX]
- MOV AL,[SI]
- INC BX
- INC SI
- CMP DL,AL
- JNZ SHORT #RST_C ; ミスマッチ時は、キャリーリセット
- DEC AH ; 比較終了(8文字)
- JNZ SHORT #LOOP1
- #SET_C: STC
- POP DX
- POP SI
- RET
- #RST_C: CLC
- POP DX
- POP SI
- RET
- COMPARE ENDP
-
- ; パラメータを1つパス(前後のスペースも飛ばす) BX:パラメータ先頭
- PASS PROC
- #LOOP0: MOV AL,[BX] ;
- INC BX ; 前のスペースをパス
- CMP AL,020H ;
- JZ SHORT #LOOP0 ;
- DEC BX ;
-
- #LOOP1: MOV AL,[BX] ;
- CMP AL,CR ; CR/SPACE 以外をパス
- JZ SHORT #BYE ;
- CMP AL,020H ;
- JZ SHORT #NEXT0 ;
- INC BX ;
- JMP SHORT #LOOP1 ;
-
- #NEXT0: MOV AL,[BX] ;
- INC BX ; 後ろのスペースをパス
- CMP AL,020H ;
- JZ SHORT #NEXT0 ;
- DEC BX
- #BYE: RET
- PASS ENDP
-
-
- PSP PROC
- MOV SI,OFFSET FCB1 ;
- MOV BX,OFFSET FCB2 ;
- MOV DL,010H ;
- #LOOP0: MOV AL,[BX] ;
- INC BX ;
- MOV [SI],AL ; FCB1の作成
- INC SI ; ( FCB2 を複写 ^^; )
- DEC DL ;
- JNZ SHORT #LOOP0 ;
-
- MOV SI,FCB2 ; 省略してしまえ!!
-
- XOR AL,AL ;
- MOV [SI],AL ; ドライブをカレントにする
- INC SI ; ( FCB2 の仮作成・その1 )
-
- MOV DL,11 ;
- MOV AL,020H ; ファイル名をスペースで埋める
- #LOOP1: MOV [SI],AL ; ( FCB2 の仮作成・その2 )
- INC SI ;
- DEC DL ;
- JNZ SHORT #LOOP1 ;
-
- MOV BX,OFFSET DTA+1
- CALL PASS ; 第一パラメータ(コマンド名)をパス
- CALL PASS ; 第二パラメータ(FCBに展開済)をパス
- MOV SI,OFFSET FCB2
-
- CMP AL,CR ;
- JZ SHORT #BYE ; もうパラメータがなければ終了
-
- MOV AX,[BX] ; パラメータの二バイト目が・・・
- CMP AH,03AH ; ':' じゃない時は、
- JNZ SHORT #NEXT1 ; ドライブ番号処理なし
-
- CALL CHECK
- JNC SHORT #BYE ; JNC:×
- CMP AL,02EH ; '.'もダメ
- JE SHORT #BYE
- CAPITAL AL
- SUB AL,040H
- MOV [SI],AL
- ADD BX,2 ; ドライブ名はパス
-
- #NEXT1: INC SI
- MOV DL,8
-
- #LOOP2: MOV AL,[BX]
- INC BX
- CALL CHECK
- JNC SHORT #BYE ; JNC:×
- CMP AL,02EH ; '.'
- JZ SHORT #NEXT2
- MOV [SI],AL
- INC SI
- DEC DL
- JNZ SHORT #LOOP2
-
- #LOOP: MOV AL,[BX]
- INC BX
- CALL CHECK
- JNC SHORT #BYE ; JNC:×
- CMP AL,02EH
- JZ SHORT #NEXT2
- JMP SHORT #LOOP
-
-
- #NEXT2: MOV SI,0075H
- MOV DL,3
-
- #LOOP3: MOV AL,[BX]
- INC BX
- CALL CHECK
- JNC SHORT #BYE ; JNC:×
- CMP AL,02EH ; '.'
- JZ SHORT #BYE
- MOV [SI],AL
- INC SI
- DEC DL
- JNZ SHORT #LOOP3
-
- #BYE: MOV BX,OFFSET DTA+1
- MOV SI,BX
- CALL PASS
- CMP AL,CR
- JZ SHORT #BYE2
- DEC BX
- INC DL
-
- #BYE2: PUSH BX
- SUB BX,SI
- DEC SI
- MOV AL,[SI]
- SUB AL,BL
- MOV [SI],AL
- INC SI
-
- MOV DL,AL
- POP BX
- INC DL
- #LOOP4: MOV AL,[BX]
- MOV [SI],AL
- INC BX
- INC SI
- DEC DL
- JNZ SHORT #LOOP4
- RET
- PSP ENDP
-
- ; ファイル名に有効なキャラクタかどうか調べる(AL)
- CHECK PROC
- CMP AL,05EH
- JNC SHORT #S_RET
- CMP AL,05BH
- JNC SHORT #C_RET
- CMP AL,040H
- JNC SHORT #S_RET
- CMP AL,03AH
- JNC SHORT #C_RET
- CMP AL,02DH
- JNC SHORT #S_RET
- CMP AL,02AH
- JNC SHORT #C_RET
- CMP AL,021H
- JNC SHORT #S_RET
-
- #C_RET: CLC ;
- RET ; JNC :×
- #S_RET: STC ; JC :○
- RET ;
- CHECK ENDP
-
- TRANS PROC
- MOV BX,0F000H
- MOV SI,OFFSET EXEC
- MOV DL,BYTE PTR HEADER-EXEC
- #LOOP: MOV AL,[SI]
- INC SI
- MOV [BX],AL
- INC BX
- DEC DL
- JNZ SHORT #LOOP
- RET
- TRANS ENDP
-
-
- EXEC PROC ; アドレスBPから、DIバイトをコピー
- MOV BX,0100H
- #EXEC1: MOV AL,[BP]
- INC BP
- MOV [BX],AL
- INC BX
- DEC DI
- JNZ SHORT #EXEC1
- MOV AX,0100H
- JMP AX
- EXEC ENDP
-
-
- HEADER DB 00 ; ヘッダー開始位置,プログラム連結数ゼロ
- CODE ENDS
- END START
-